package cn.jiyun.controller;


import cn.jiyun.Result.Result;
import cn.jiyun.pojo.DTO.OrdersDto;
import cn.jiyun.service.OrdersService;
import cn.jiyun.util.BoxWhiskerTool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

/**
 * 订单表(Orders)表控制层
 *
 * @author makejava
 * @since 2024-12-20 09:38:33
 */
@RestController
@RequestMapping("orders")

@Slf4j
public class OrdersController {

    @Autowired
    private OrdersService ordersService;


    @GetMapping("findDateAll")
    public Result findDateAll(){
        List<String> list = ordersService.findDateAll();
        return Result.ok(list);
    }




    /**
     * 投诉处理情况
     * */

    @GetMapping("getComplaint")
    public Result getComplaint(){
        Double list = ordersService.getComplaint();
        //保留两位小数
        list = new BigDecimal(list).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        return Result.ok(list);
    }


    /**
     * 获取未接单的订单信息
     *
     * @return 返回未接单的订单信息结果对象
     */
    @GetMapping("getUnansweredOrders")
    public Result getUnansweredOrders() {
        return Result.ok(ordersService.getUnansweredOrders());
    }

    /**
     * 获取已完成的订单信息
     *
     * @return 返回已完成的订单信息结果对象
     */
    @GetMapping("getOrderComplete")
    public Result getOrderComplete() {
        return Result.ok(ordersService.getOrderComplete());
    }

    /**
     * 获取上午时段的数据信息
     *
     * @return 返回上午时段的数据信息结果对象
     */
    @GetMapping("getDataMorning")
    public Result getDataMorning() {
        return Result.ok(ordersService.getDataMorning());
    }

    /**
     * 获取下午时段的数据信息
     *
     * @return 返回下午时段的数据信息结果对象
     */
    @GetMapping("getDataAfternoon")
    public Result getDataAfternoon() {
        return Result.ok(ordersService.getDataAfternoon());
    }

    /**
     * 获取当天的数据信息
     *
     * @return 返回当天的数据信息结果对象
     */
    @GetMapping("getThatDayNum")
    public Result getThatDayNum() {
        return Result.ok(ordersService.getData());
    }

    /**
     * 获取统计图横向日期
     *
     * @param ordersDto 订单DTO对象，包含查询条件
     * @return 返回统计图横向日期列表
     */
    @PostMapping("getDatesInRange")
    public Result getDatesInRange(@RequestBody OrdersDto ordersDto) {
        List<String> dates = ordersService.getDatesInRange(ordersDto);
        return Result.ok(dates);
    }

    /**
     * 获取统计图纵向未接单数据
     *
     * @param ordersDto 订单DTO对象，包含查询条件
     * @return 返回统计图纵向未接单数据列表
     */
    @PostMapping("getOrderCountsInRange")
    public Result getOrderCountsInRange(@RequestBody OrdersDto ordersDto) {
        List<String> dates = ordersService.getOrderCountsInRange(ordersDto);
        return Result.ok(dates);
    }

    /**
     * 获取统计图纵向已完成单数据
     *
     * @param ordersDto 订单DTO对象，包含查询条件
     * @return 返回统计图纵向已完成单数据列表
     */
    @PostMapping("getOrderCountsInRange2")
    public Result getOrderCountsInRange2(@RequestBody OrdersDto ordersDto) {
        List<String> dates = ordersService.getOrderCountsInRange2(ordersDto);
        return Result.ok(dates);
    }

    /**
     * 获取流入金额（乘客支付）
     *
     * @return 返回流入金额结果对象
     */
    @GetMapping("getInflow")
    public Result getInflow() {
        BigDecimal inflow = ordersService.getInflow();
        return Result.ok(inflow);
    }

    /**
     * 获取 earnings（收益）
     *
     * @return 返回收益结果对象
     */
    @GetMapping("getEarnings")
    public Result getEarnings() {
        Double earnings = ordersService.getEarnings();
        return Result.ok(earnings);
    }

    /**
     * 流入金额（乘客支付）
     *
     * @param ordersDto 订单DTO对象，包含查询条件
     * @return 返回流入金额列表
     */
    @PostMapping("getTotalAmountInRange")
    public Result getTotalAmountInRange(@RequestBody OrdersDto ordersDto) {
        log.info("OrdersDto:{}", ordersDto);
        List<BigDecimal> totalAmountInRange = ordersService.getTotalAmountInRange(ordersDto);
        return Result.ok(totalAmountInRange);
    }

    /**
     * 流出金额（司机收入 + 附加费）
     *
     * @param ordersDto 订单DTO对象，包含查询条件
     * @return 返回流出金额列表
     */
    @PostMapping("getTotalDriverEarningsInRange")
    public Result getTotalDriverEarningsInRange(@RequestBody OrdersDto ordersDto) {
        List<BigDecimal> totalDriverEarningsInRange = ordersService.getTotalDriverEarningsInRange(ordersDto);
        return Result.ok(totalDriverEarningsInRange);
    }

    /**
     * 流出金额（保险 + 核销费）
     *
     * @param ordersDto 订单DTO对象，包含查询条件
     * @return 返回流出金额列表
     */
    @PostMapping("getTheTotalWriteOffAmountWithinTheRange")
    public Result getTheTotalWriteOffAmountWithinTheRange(@RequestBody OrdersDto ordersDto) {
        List<BigDecimal> totalWriteOffAmountWithinTheRange = ordersService.getTheTotalWriteOffAmountWithinTheRange(ordersDto);
        return Result.ok(totalWriteOffAmountWithinTheRange);
    }

    /**
     * 获取司机收益
     *
     * @param ordersDto 订单DTO对象，包含查询条件
     * @return 返回司机收益列表
     */
    @PostMapping("getEarningsAmount")
    public Result getEarningsAmount(@RequestBody OrdersDto ordersDto) {
        List<BigDecimal> totalWriteOffAmountWithinTheRange = ordersService.getEarningsAmount(ordersDto);
        return Result.ok(totalWriteOffAmountWithinTheRange);
    }

    /**
     * 单均流入金额（乘客支付）
     *
     * @param ordersDto 订单DTO对象，包含查询条件
     * @return 返回单均流入金额列表
     */
    @PostMapping("getAvgTotalAmount")
    public Result getAvgTotalAmount(@RequestBody OrdersDto ordersDto) {
        log.info("OrdersDto:{}", ordersDto);
        List<BigDecimal> avgTotalAmount = ordersService.getAvgTotalAmount(ordersDto);
        return Result.ok(avgTotalAmount);
    }

    /**
     * 单均流出金额（司机收入 + 附加费）
     *
     * @param ordersDto 订单DTO对象，包含查询条件
     * @return 返回单均流出金额列表
     */
    @PostMapping("getAvgDriverIncome")
    public Result getAvgDriverIncome(@RequestBody OrdersDto ordersDto) {
        List<BigDecimal> avgDriverIncome = ordersService.getAvgDriverIncome(ordersDto);
        return Result.ok(avgDriverIncome);
    }

    /**
     * 单均流出金额（保险 + 核销费）
     *
     * @param ordersDto 订单DTO对象，包含查询条件
     * @return 返回单均流出金额列表
     */
    @PostMapping("getTotalCancelMoney")
    public Result getTotalCancelMoney(@RequestBody OrdersDto ordersDto) {
        List<BigDecimal> totalCancelMoney = ordersService.getTotalCancelMoney(ordersDto);
        return Result.ok(totalCancelMoney);
    }

    /**
     * 获取平台平均收益
     *
     * @param ordersDto 订单DTO对象，包含查询条件
     * @return 返回平台平均收益列表
     */
    @PostMapping("getAvgEarnings")
    public Result getAvgEarnings(@RequestBody OrdersDto ordersDto) {
        List<BigDecimal> avgEarnings = ordersService.getAvgEarnings(ordersDto);
        return Result.ok(avgEarnings);
    }

    /**
     * 司机人均订单数
     *
     * @param ordersDto 订单DTO对象，包含查询条件
     * @return 返回司机人均订单数列表
     */
    @PostMapping("getLoginStatistics")
    public Result getLoginStatistics(@RequestBody OrdersDto ordersDto) {
        log.info("OrdersDto:{}", ordersDto);
        if (ordersDto.getVehicleTypes() == null || ordersDto.getVehicleTypes().length == 0) {
            ordersDto.setVehicleTypes(new Integer[]{0});
        }
        List<Integer> loginStatistics = ordersService.getLoginStatistics(ordersDto);
        return Result.ok(loginStatistics);
    }

    /**
     * 司机人均收益
     *
     * @param ordersDto 订单DTO对象，包含查询条件
     * @return 返回司机人均收益列表
     */
    @PostMapping("getPerCapitaIncome")
    public Result getPerCapitaIncome(@RequestBody OrdersDto ordersDto) {
        log.info("OrdersDto:{}", ordersDto);
        if (ordersDto.getVehicleTypes() == null || ordersDto.getVehicleTypes().length == 0) {
            ordersDto.setVehicleTypes(new Integer[]{0});
        }
        log.error("OrdersDto:{}", ordersDto);
        List<BigDecimal> loginStatistics = ordersService.getPerCapitaIncome(ordersDto);
        return Result.ok(loginStatistics);
    }


    /**
     * 获取盒须图数据
     * */

    @PostMapping("getBoxWhiskerList")
    public Result getBoxWhiskerList(@RequestBody OrdersDto ordersDto) throws ParseException {
        ArrayList<List<Double>> dateAll = ordersService.getBoxWhiskerList(ordersDto);
        return Result.ok(dateAll);
    }

}

